package cn.tedu.tickets;
/*需求:设计多线程模型,4个窗口共计售票100张
 * 本方案使用多线程编程方案2,实现Runnable接口的方式来完成*/
public class TestRunnable {
    public static void main(String[] args) {
        //5.创建自定义类的对象作为唯一的业务对象
        TicketRunnable target = new TicketRunnable(); //hidden/foded: 一个业务对象, 一个成员变量分配给,4个线程对象,被4个对象的start一起先后调用使用,
        //6.创建多个线程对象,并将唯一的业务对象作为参数传入
        Thread t1 = new Thread(target);
        Thread t2 = new Thread(target);
        Thread t3 = new Thread(target);
        Thread t4 = new Thread(target);
        //7.以多线程的方式启动多个线程
        t1.start();  //1)一方面父类方法将线程加入就绪队列;2)一方面调用继承父类的方法Start,所以是父类的线程名字
        t2.start();
        t3.start();
        t4.start();
//        t1.run(); //最终是调用的子类重写的target.run();,so main线程

        //PS: 父类方法Start就是打印父类定义的名字,(虽然先调用父类run,但还是跳转会回了taeget子类的run)子类重写方法run()
    }
}
//1.自定义多线程类实现Runnable接口
class TicketRunnable implements Runnable{//之前TicketRunnable
    //3.定义变量,保存票数
    /*由于自定义类对象,作为唯一的业务对象,只new了一次
     * 所以发布的任务,也就是票数天然的会被所有线程对象共享,无需设置为静态也只有一份*/
    //2.添加父接口中未实现的方法,里面是我们自己的业务//未实现的方法
    /*static*/ int tickets = 100;
    @Override
    public void run() {

        //4.循环卖票//循环卖票
        while(true){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            /*try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
            System.out.println(Thread.currentThread().getName()+"="+tickets--);
            if(tickets <= 0) break;//没票了
        }
    }
}